//                            _ooOoo_  
//                           o8888888o  
//                           88" . "88  
//                           (| -_- |)  
//                            O\ = /O  
//                        ____/`---'\____  
//                      .   ' \\| |// `.  
//                       / \\||| : |||// \  
//                     / _||||| -:- |||||- \  
//                       | | \\\ - /// | |  
//                     | \_| ''\---/'' | |  
//                      \ .-\__ `-` ___/-. /  
//                   ___`. .' /--.--\ `. . __  
//                ."" '< `.___\_<|>_/___.' >'"".  
//               | | : `- \`.;`\ _ /`;.`/ - ` : | |  
//                 \ \ `-. \_ __\ /__ _/ .-` / /  
//         ======`-.____`-.___\_____/___.-`____.-'======  
//                            `=---='  
//  
//         .............................................  
//                  佛祖保佑             永无BUG 
//          佛曰:  
//                  写字楼里写字间，写字间里程序员；  
//                  程序人员写程序，又拿程序换酒钱。  
//                  酒醒只在网上坐，酒醉还来网下眠；  
//                  酒醉酒醒日复日，网上网下年复年。  
//                  但愿老死电脑间，不愿鞠躬老板前；  
//                  奔驰宝马贵者趣，公交自行程序员。  
//                  别人笑我忒疯癫，我笑自己命太贱；  
//                  不见满街漂亮妹，哪个归得程序员？  


/* ****************************************************************************
 * Author: 671643387
 * Date: 2015/7/22
 * ***************************************************************************/

///////////////////////////////////////////////////////////////////////////////
// 远古封印

function ElderSign() {
    this.eldersign = {};

    this.updates = {};
    this.dirtyCount = 0;
}

ElderSign.create = function(){
    gDBWorld.insert({_id:"eldersign", eldersign:{}}, function(err, result){});
};

ElderSign.prototype = {

    init: function(fn){
        // 读取平乱数据
        gDBWorld.findOne({_id : 'eldersign'}, {}, function(err, doc){
            if( doc ) {
                this.eldersign = doc.eldersign;
            }
            fn();
        }.bind(this));
    },

    markDirty: function(uid, data){
        this.eldersign[uid] = data;
        this.updates[util.format('eldersign.%d', uid)] = data;
        this.dirtyCount++;
    },

    save: function(force, fn){
        if (!force && (this.dirtyCount < 1)) {
            fn && fn(true);
        } else {
            var updates = this.updates;
            this.updates = {};
            this.dirtyCount = 0;

            gDBWorld.update({_id : 'eldersign'}, {$set:updates}, true, function(err, result){
                if( err ) {
                    ERROR(util.format('SAVE ELDER SIGN: %j %j', updates, err));
                    fn && fn(false);
                }else {
                    LOG(util.format('SAVE ELDER SIGN: %j', updates));
                    fn && fn(true);
                }
            });
        }
    },

    _getByUid: function(uid) {
        var _uSign = this.eldersign[uid] || {
                time: Date.getStamp(),
                awardTime: 0,
                signs: {
                    0: {},
                    1: {},
                    2: {}
                }
            };

        if (Date.getDayPassed(_uSign.time) != 1) {  // 跨天，更新数据
            _uSign = {
                time: Date.getStamp(),
                awardTime: 0,
                signs: {
                    0: {},
                    1: {},
                    2: {}
                }
            };
            this.markDirty(uid, _uSign);
            this.save();
        }

        return _uSign;
    },

    /**
     * 获取好友远古封印对于当前玩家的可见状态
     * @param fUid
     * @param mUid
     */
    getFriendStatus: function(fUid, mUid) {
        var _uSign = this._getByUid(fUid);
        var _signs = _uSign.signs;
        // 封印全部开启，不可见
        if (_signs[2].hasOwnProperty('uid')) {
            return false;
        }

        // 第一个封印未开启，不可见
        if (!_signs[0].hasOwnProperty('uid')) {
            return false;
        }

        // 已经帮这好友开启过了，不可见
        if (_signs[1].uid == mUid) {
            return false;
        }

        return true;
    },

    /**
     * 获取指定uid的远古封印数据
     * @param uid
     * @returns {*}
     */
    getByUid: function(uid) {
        return this._getByUid(uid);
    },

    /**
     * 开启封印
     * @param fUid
     * @param mUid
     * @param un
     * @param lv
     * @param star
     */
    openSign: function(fUid, mUid, un, lv, star) {
        var _retRes = {};

        var _fSign = this._getByUid(fUid);
        var _fSlots = _fSign.signs;

        var alreadyOpenOne = false;

        // 查找未被开启的封印
        var slotIdx = 0;
        for (;slotIdx < 3; slotIdx++) {
            var slot = _fSlots[slotIdx];
            var slotUid = slot.uid || -1;
            if (slotUid == -1) {
                break;
            } else if (slotUid == mUid && slotIdx != 0) {
                alreadyOpenOne = true;
                break;
            }
        }

        // 只能帮助好友开启一个封印
        if (alreadyOpenOne) {
            _retRes.code = 1;
            _retRes.desc = "only can help open one";
        }

        if (slotIdx > 2) {  // 封印已经全部开启
            _retRes.code = 2;
            _retRes.desc = "all opened";
        } else if (slotIdx == 0 && fUid != mUid) {  // 开启第一个封印，需要玩家自己开启
            _retRes.code = 1;
            _retRes.desc = "first must open by player self";
        } else if (slotIdx != 0 && fUid == mUid) {   // 玩家只能开启自己的第一个封印
            _retRes.code = 1;
            _retRes.desc = "player can only open the first of its self";
        }

        if (_retRes.code)
        {
            return _retRes;
        }

        // 更新数据
        _fSign.signs[slotIdx] = {
            uid: mUid,
            un: un,
            lv: lv,
            star: star
        };

        this.markDirty(fUid, _fSign);
        this.save();

        return {
            slot: slotIdx,
            signs: _fSign.signs
        };
    }
};

exports.ElderSign = ElderSign;